const Fly = require('flyio/dist/npm/wx')
const fly = new Fly()
// fly.js 中文文档: https://wendux.github.io/dist/#/doc/flyio/readme

import store from '@/store/store.js'
import config from '@/common/config.js'
import util from '@/common/util.js'

// 配置请求头和基础URL
fly.config.headers['Content-Type'] = 'application/json'
fly.config.baseURL = config.baseURL

/**
 * 显示错误提示
 * @param {string} message - 错误信息
 */
const showErrorToast = (message) => {
  uni.showToast({
    title: message,
    icon: 'none',
    duration: 2000
  })
}

/**
 * 处理登录过期逻辑
 */
const handleTokenExpired = () => {
  console.log('登录过期，需要重新登录')
  util.logoutClear()
  store.dispatch('LogOut')
  // 使用replace避免回退到登录页
  uni.redirectTo({ url: '/pages/login/role' })
}

// 请求拦截器
fly.interceptors.request.use((request) => {
  const token = util.getToken()
  
  if (token) {
    request.headers.Authorization = `Bearer ${token}`
  }
  
  // 可以在这里添加请求加载动画等
  // console.log('请求参数:', request)
  return request
})

/**
 * 响应拦截器说明:
 * - 自定义字段cHideError: 发生错误时是否不提示信息(网络错误/超时除外)，默认false
 */
// 响应拦截器
fly.interceptors.response.use(
  function (response) {
    // 服务器返回数据
    const result = response.data
    // 处理401登录过期(服务端自定义状态码)
    if (result.code === 401) {
      handleTokenExpired()
      return Promise.reject(result)
    }
    // 处理成功状态
    if (result.code === 200) {
      return result
    }
    // 其他错误状态码(非200非401)
    console.log('请求错误:', response)
    // 非隐藏错误才显示提示
    if (!response.request.cHideError) {
      showErrorToast(result.msg || '请求失败')
    }
    return Promise.reject(result)
  },
  function (error) {
    // 网络错误/请求失败处理
    let errorMessage = error.message || '请求失败'
    
    // 解析服务端返回的错误信息
    if (error.response?.data?.msg) {
      errorMessage = error.response.data.msg
    } 
    // HTTP状态码处理
    else if (error.status) {
      switch (error.status) {
        case 401:
          handleTokenExpired()
          return Promise.reject(error)
        case 404:
          errorMessage = '请求的资源不存在'
          break
        case 500:
        case 502:
        case 503:
          errorMessage = '服务器繁忙，请稍后再试'
          break
        case 0:
          errorMessage = '网络连接失败，请检查网络'
          break
        case 1:
          errorMessage = '请求超时，请稍后重试'
          break
      }
    }
    
    // 非隐藏错误才显示提示
    if (!error.request?.cHideError) {
      showErrorToast(errorMessage)
    }
    
    return Promise.reject(error)
  }
)

export default fly
